#pragma once

#include <list>
#include "Globals.h"
#include "rapidxml.hpp"

using namespace rapidxml;

namespace game_engine { namespace data_format
{

typedef xml_document<> XmlDocument;
typedef xml_node<> XmlNode;

/*!
 * \class XmlUtils
 * \brief 
 */
class XmlUtils
{
///////////////////////////////////////////////////////////////////////////////
// Attribute definition
///////////////////////////////////////////////////////////////////////////////
public:
    static string SEPARATOR;

///////////////////////////////////////////////////////////////////////////////
// Method definition
///////////////////////////////////////////////////////////////////////////////
public:
    // Constructors and Destructors
    virtual ~XmlUtils(void) = 0;

    //static XmlNode* parseFile(const string &filename, XmlDocument &doc);
    static const list< XmlNode* > getNodes(const string &path, XmlDocument &doc);
    static const INT32 getINT32(const string &path, XmlDocument &doc);
    static const UINT32 getUINT32(const string &path, XmlDocument &doc);
    static const FLOAT32 getFLOAT32(const string &path, XmlDocument &doc);
    static const string getString(const string &path, XmlDocument &doc);
    static const INT32 getINT32(const string &path, XmlNode *rootNode);
    static const UINT32 getUINT32(const string &path, XmlNode *rootNode);
    static const FLOAT32 getFLOAT32(const string &path, XmlNode *rootNode);
    static const string getString(const string &path, XmlNode *rootNode);
    static const string readAll(const string &filename);

private:
    static const list<string> splitPath(const string &path);
    static XmlNode* findNode(list<string> &nodeList, XmlDocument &doc);
    static XmlNode* findNode(const string &path, XmlDocument &doc);
    static XmlNode* getNode(const list<string> &nodeList, XmlNode *rootNode);

};

}}
